﻿' ******************************************************************************
' ** 
' **  Yahoo Finance Managed
' **  Written by Marius Häusler 2010
' **  It would be pleasant, if you contact me when you are using this code.
' **  Contact: YahooFinanceManaged@gmail.com
' **  Project Home: http://code.google.com/p/yahoo-finance-managed/
' **  
' ******************************************************************************
' **  
' **  Copyright 2010 Marius Häusler
' **  
' **  Licensed under the Apache License, Version 2.0 (the "License");
' **  you may not use this file except in compliance with the License.
' **  You may obtain a copy of the License at
' **  
' **    http://www.apache.org/licenses/LICENSE-2.0
' **  
' **  Unless required by applicable law or agreed to in writing, software
' **  distributed under the License is distributed on an "AS IS" BASIS,
' **  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
' **  See the License for the specific language governing permissions and
' **  limitations under the License.
' ** 
' ******************************************************************************




Namespace Base


    Public Interface IStringDownload
        Property TextEncoding() As System.Text.Encoding
    End Interface


    ''' <summary>
    ''' Provides internal methods for downloading String data. This class must be inherited.
    ''' </summary>
    ''' <remarks></remarks>
    Public MustInherit Class StringDownload
        Inherits Download
        Implements IStringDownload


        Protected Event AsyncStringDownloadCompleted(ByVal sender As Download, ByVal ba As StringDownloadCompletedEventArgs)

        Private mTextEncoding As System.Text.Encoding = System.Text.Encoding.UTF8

        ''' <summary>
        ''' The used encoding information for converting stream to String data.
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Property TextEncoding() As System.Text.Encoding Implements IStringDownload.TextEncoding
            Get
                Return mTextEncoding
            End Get
            Set(ByVal value As System.Text.Encoding)
                If value IsNot Nothing Then : mTextEncoding = value
                Else : mTextEncoding = System.Text.Encoding.Default
                End If
            End Set
        End Property

        Protected Overloads Function Download(ByVal url As String) As StringResponse
            Return Me.ToResponse(MyBase.Download(url))
        End Function

        ''' <summary>
        ''' Default constructor
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub New()
        End Sub

        Private Sub BaseAsyncDownload_Completed(ByVal sender As Download, ByVal e As StreamDownloadCompletedEventArgs) Handles MyBase.AsyncStreamDownloadCompleted
            Dim args As New StringDownloadCompletedEventArgs(e.UserArgs, Me.ToResponse(e.Response))
            RaiseEvent AsyncStringDownloadCompleted(Me, args)
        End Sub


        Private Function ToResponse(ByVal resp As StreamResponse) As StringResponse
            Dim text As String = String.Empty
            If resp.Connection.State = ConnectionState.Success Then
                text = mHelper.StreamToString(resp.Result, Me.TextEncoding)
            End If
            mHelper.CloseStream(resp.Result)
            Return New StringResponse(resp.Connection, text)
        End Function
      
    End Class


    Public Class StringDownloadCompletedEventArgs
        Inherits DownloadCompletedEventArgs
        Public Overloads ReadOnly Property Response() As StringResponse
            Get
                Return DirectCast(MyBase.Response, StringResponse)
            End Get
        End Property
        Public Sub New(ByVal userArgs As Object, ByVal response As StringResponse)
            MyBase.New(userArgs, response)
        End Sub
    End Class


    Public Class StringResponse
        Inherits Response
        Public Overloads ReadOnly Property Result() As String
            Get
                Return IIf(MyBase.Result IsNot Nothing, MyBase.Result.ToString, "").ToString
            End Get
        End Property
        Public Sub New(ByVal info As ConnectionInfo, ByVal result As String)
            MyBase.New(info, result)
        End Sub
    End Class

End Namespace